package stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
 * 常用方法
 *
 * @author
 */
public class Test2 {
    public static void main(String[] args) {
        List<Domain> list = new ArrayList<>();

        Domain info = new Domain();
        info.setId("123;2344");
        info.setName("塑料袋");

        Domain info1 = new Domain();
        info1.setId("234;80;0987");
        info1.setName("sdfg");

        list.add(info);
        list.add(info1);

        // 一.peek用法，类似foreach
        // T -> void
        Consumer<Domain> consumer = a -> System.out.println(a.getId());
        list.stream().peek(consumer).collect(Collectors.toList());

        // 或
        list.stream().peek(a -> System.out.println(a.getId())).collect(Collectors.toList());

        // 二.reduce用法,两个入参的操作结果作为下一次操作的入参
        BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
        Integer num = Arrays.asList(1, 2, 3, 4, 5).stream().reduce(binaryOperator).get();
        System.out.println("raduce:" + num);

        // 或
        Integer num1 = Arrays.asList(1, 2, 3, 4, 5).stream().reduce((a, b) -> a + b).get();
        System.out.println(num1);

        // 三.flatMap用法，flat（扁平），对流扁平化处理
        // 操作具有一对多转换应用的场景，将每个元素转换后的流里的集合内容展平为新的流，解释一下即：[[123;2344],[234;80;0987]] => [123;2344;234;80;0987]
        // function入参为一个String，输出一个集合流，flatMap把所有集合流的内容做合集。
//         List<Object> ids = list.stream().map(e -> e.getId()).flatMap(x -> Arrays.stream(null, x.length, num1)).collect(Collectors.toList());
//         System.out.println(ids);

        // 或
        // function入参为一个[String]，没做其他处理，只是把集合转成流，输出一个集合流，flatMap把所有集合流的内容做合集。
//         List<String> ids1 = list.stream().map(e -> e.getId().length).flatMap(Arrays::stream).collect(Collectors.toList());
//         System.out.println(ids1);

    }
}
